0832. 翻转图像【简单】
1. 📝 题目描述
- 给定一个
n x n的二进制矩阵image,先 水平 翻转图像,然后 反转 图像并返回 结果。 - 水平 翻转图片就是将图片的每一行都进行翻转,即逆序。
- 例如,水平翻转
[1,1,0]的结果是[0,1,1]。
- 例如,水平翻转
- 反转 图片的意思是图片中的
0全部被1替换,1全部被0替换。- 例如,反转
[0,1,1]的结果是[1,0,0]。
- 例如,反转
示例 1:
txt
输入:image = [[1,1,0],[1,0,1],[0,0,0]]
输出:[[1,0,0],[0,1,0],[1,1,1]]
解释:
首先翻转每一行: [[0,1,1],[1,0,1],[0,0,0]];
然后反转图片: [[1,0,0],[0,1,0],[1,1,1]]1
2
3
4
5
6
2
3
4
5
6
示例 2:
txt
输入:image = [[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]
输出:[[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
解释:
首先翻转每一行: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]];
然后反转图片: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]1
2
3
4
5
6
2
3
4
5
6
提示:
n == image.lengthn == image[i].length1 <= n <= 20images[i][j]==0或1.
2. 🎯 s.1 - 暴力解法
js
/**
* @param {number[][]} image
* @return {number[][]}
*/
var flipAndInvertImage = function (image) {
const n = image.length
const m = image[0].length
// 步骤1:水平翻转每一行
for (let i = 0; i < n; i++) {
image[i].reverse()
}
// 步骤2:反转图像(0变1,1变0)
for (let i = 0; i < n; i++) {
for (let j = 0; j < m; j++) {
image[i][j] = 1 - image[i][j]
}
}
return image
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- 时间复杂度:
,需要遍历矩阵两次 - 空间复杂度:
,原地修改
3. 🎯 s.2 - 双指针
js
/**
* @param {number[][]} image
* @return {number[][]}
*/
var flipAndInvertImage = function (image) {
const n = image.length
for (let i = 0; i < n; i++) {
let left = 0
let right = n - 1
// 双指针从两端向中间处理
while (left < right) {
// 如果两个位置的值不同,翻转并反转后值不变,无需处理
// 如果两个位置的值相同,翻转并反转后会改变
if (image[i][left] === image[i][right]) {
image[i][left] = 1 - image[i][left]
image[i][right] = 1 - image[i][right]
}
left++
right--
}
// 处理奇数长度数组的中间元素
if (left === right) {
image[i][left] = 1 - image[i][left]
}
}
return image
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
- 时间复杂度:
,其中 n 是矩阵的行数,m 是矩阵的列数,需要遍历矩阵中的每个元素 - 空间复杂度:
,原地修改,只使用了常数个额外变量 - 算法思路:
- 题目要求对矩阵进行两次转换
- 如果 left、right 指针指向的值不同,那么两次转换后原始位置的值是相同的,结果不变,无需交换;
- 如果 left、right 指针指向的值相同,那么两次转换后原始位置的值是相反的,结果需要交换。
- 可以在水平翻转的同时进行反转操作。
- 题目要求对矩阵进行两次转换